package com.bsoft.AQS;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @program: demo
 * @description: 可重入锁  可重复可递归调用的锁 ，在外层使用锁之后 在内层仍然可以使用 ，并不发生死锁 ，这样的锁就叫作可重入锁
 * 在一个Synchronized 修饰的方法或代码块的内部
 * 调用本类的其他synchronized修饰的方法或代码块时 是永远可以得到锁的
 * @author: hdh
 * @create: 2022:03:31 14:32
 */
public class ReeterLock2Demo {
    static Lock lock = new ReentrantLock();

    public static void main(String[] args) {
        new Thread(() -> {
            lock.lock();
            lock.lock();
            try {
                System.out.println("=======外层");
                try {
                    lock.lock();
                    System.out.println("=======内层");
                } finally {
                    lock.unlock();
                }
            } finally {
                //这里故意注释 实现加锁次数和释放次数不一样
                // 由于加锁次数好释放次数不一样 第二个线程始终无法获取到锁 导致一直在等待
                //正常情况 ，加锁几次 就要解锁几次
                lock.unlock();
                lock.unlock();
            }
        }, "t1").start();

        new Thread(() -> {
            lock.lock();
            try {
                System.out.println(Thread.currentThread().getName() + "\t" + "--------调用开始");
            } finally {
                lock.unlock();
            }
        }, "t2").start();
    }
}
